#!/bin/bash
###############################################################################
##                                                                           ##
## Скрипт пытается добавить пакеты и исходники, лежащие в указанном каталоге ##
## (а также его подкаталогаг, если выставлена опция), в локальный            ##
## репозиторий, созданный программой reprepro                                ##
##                                                                           ##
###############################################################################
function help()
{
echo "repo-add - Скрипт пытается добавить пакеты и исходники, лежащие в
указанном каталоге (а также ее подкаталогаг, если выставлена опция),
в локальный репозиторий, созданный программой reprepro

Использование:
repo-add [параметры] [[опции]|[имя_пакета.deb]]

Параметры:
-D PATH_TO_DIR:	 	Путь к каталогу, в котором нужно искать пакеты
			и/или исходники (если не указана, то текущая)
-R REP_PATH:		Корневой каталог репозитория (указывать не нужно)
-C COMPONENT:		раздел репозитория (main/cache/cdrom), по умолчанию main
-N CODENAME:		кодовое имя дистрибутива, (lenny/squeeze/...), по
			умолчанию local_current

Опции:
По умолчанию скрипт ищет в указанном каталоге файл *.changes и пытается
добавить исходники и пакеты в соответствии с данным файлом. Данные
опции заставляют его работать по другому:
-s:			Добавить исходники (.dsc, .diff.gz and .orig.tar.gz)
-p:			Добавить пакеты (.deb and .udeb)
-a:			Добавить пакеты и исходники
-i:			Просматривать подкаталоги
-maxdepth DEPTH:	Глубина просмотра подкаталогов, может быть указана
			только если указана опция -i (неотрицательное
			число, 1 соответствует поиску только в указанном
			каталоге, по аналогии с утилитой find)
-cache:			Добавить пакеты (.deb) из кеша APT
-cdrom:			Добавить пакеты (.deb) из cdrom
Опции -cache и -cdrom игнорируют другие опции и параметры -C и -D
Если указано имя_пакета.deb скрипт устанавливает указаные пакеты и завершает
работу, при этом все опции игнорируются"
}
##############################################################################

# default parameters
REP_PATH=/home/repo-deb #ПАПКА РЕПОЗИТОРИЯ ПО УМОЛЧАНИЮ. ИЗМЕНИТЬ НА СВОЮ !!!
PATH_TO_DIR=./

COMPONENT="main"
CODENAME="local_current"
DEPTH=1

# default options
opt_deb=""
opt_all=""
opt_source=""
opt_pack=""
opt_change=1
opt_subdir="" # look at subdirectories
opt_depth=""
opt_cache=""
opt_cdrom=""

# Function parse options -s -a -p -i
# $1 - options string
function option_parse ()
{
opt=${1/"-"/""}
if [ `expr match "$opt" ".*\([i]\)"` ]; then
	opt_subdir=1
fi

if [ `expr match "$opt" ".*\([a]\)"` ]; then
	opt_all=1
	opt_change=""
	return
fi

if [ `expr match "$opt" ".*\([p]\)"` ]; then
	opt_pack=1
	opt_change=""
fi

if [ `expr match "$opt" ".*\([s]\)"` ]; then
	opt_source=1
	opt_change=""
fi
}

# Maximum parameters count
Num=0
# Filling the array of input parameters
for input_param in $*
do
	let "Num++" # Increment Num
	params[$Num]=$input_param
done

# Main checking cycle (check input parameters)
deb_num=0
for ((i=1; i <= Num ; i++))
do
case ${params[$i]} in

"-D") 	PATH_TO_DIR=${params[$i+1]}
	let "i++";;

"-R") 	REP_PATH=${params[$i+1]}
	let "i++";;

"-C") 	COMPONENT=${params[$i+1]}
	let "i++";;

"-N") 	CODENAME=${params[$i+1]}
	let "i++";;

-[sapi]* ) options=`expr match "${params[$i]}" "\(-[sapi]*$\)"`
	if [ "$options" = "" ]; then
		params[$Num+1]="-exit"
		params[$Num+2]=`expr match "${params[$i]}" "\(-[sapi]*\)"`
		let "Num+=2"
	else option_parse $options
	fi;;

"-maxdepth" ) DEPTH=${params[$i+1]}
	opt_depth=1
	let "i++";;

"-cache" ) opt_cache=1
	;;

"-cdrom" ) opt_cdrom=1
	;;

*.deb ) opt_deb=1
	let "deb_num++"
	deb_files[deb_num]=${params[$i]};;

"-h" | "--help" ) help
	exit;;
	
* ) 	echo "Указан не допустимый параметр или опция. Для деталей смотрите $0 --help"
	exit;;
esac
done

depth_param="-maxdepth $DEPTH"
if [ $opt_subdir ]; then
	depth_param=""
	if [ $opt_depth ]; then 
		depth_param="-maxdepth $DEPTH"
	fi
fi

# Find files with specified extension
# $1 - file extension
function find_files ()
{
list="`find $PATH_TO_DIR $depth_param -name \"*.$1\"`"
files="" #array of filenames with specified extension
f_num=0
for names in $list
do
	let "f_num++"
	files[$f_num]=$names
done
}

function list_files
{
for ((i=1; i <= f_num; i++))
do
	echo ${files[$i]}
done
}

# Add files to repository
# $1 - file extension
# $2 - include mode (include/includedsc/includedeb/includeudeb)
# $3 - string for message
function add_files ()
{
# Find files with extension specified
find_files $1
# Check if there is no files
if [ -z "$list" ]; then
	echo "There is no *.$1 file found."
fi

for ((i=1; i <= f_num; i++))
do
	if [ -n "$3" ]; then
		echo $3 ${files[$i]}
	fi
	reprepro -b $REP_PATH -C $COMPONENT $2 $CODENAME ${files[$i]}
done
}


# if need to add packages in cache
if [ $opt_cache ]; then
	reprepro -V -b $REP_PATH -C cache includedeb $CODENAME /var/cache/apt/archives/*.deb
	exit
fi

# if need to add packages in cdrom
if [ $opt_cdrom ]; then
	reprepro -V -b $REP_PATH -C cdrom includedeb $CODENAME /media/cdrom/pool/*/*/*/*.deb
	exit
fi

# If need to add packages show in command line
if [ $opt_deb ]; then
	reprepro -V -b $REP_PATH -C $COMPONENT includedeb $CODENAME ${deb_files[*]}
	exit
fi

# If using .changes file
if [ $opt_change ]; then
	add_files "changes" "include" "Add files specified in"
	exit
fi

# if need to add packages and sources
if [ $opt_all ]; then
	add_files "deb" "includedeb" "Add"
	add_files "udeb" "includeudeb" "Add"
	add_files "dsc" "includedsc" "Add sources for"
	exit
fi

# if need to add packages
if [ $opt_pack ]; then
	add_files "deb" "includedeb" "Add"
	add_files "udeb" "includeudeb" "Add"
fi

# if need to add sources
if [ $opt_source ]; then
	add_files "dsc" "includedsc" "Add sources for"
fi
